package util

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"time"
)

type LocalTime time.Time

// MarshalJSON 将 LocalTime 转换为 JSON 格式
func (t LocalTime) MarshalJSON() ([]byte, error) {
	tt := time.Time(t)
	if tt.IsZero() {
		return []byte("null"), nil
	}
	return []byte(fmt.Sprintf(`"%s"`, tt.Local().Format(time.DateTime))), nil
}

// UnmarshalJSON 从 JSON 格式解析 LocalTime
func (t *LocalTime) UnmarshalJSON(data []byte) error {
	var s string
	if err := json.Unmarshal(data, &s); err != nil {
		return err
	}
	if s == "" {
		*t = LocalTime(time.Time{})
		return nil
	}
	parsedTime, err := time.Parse(time.DateTime, s)
	if err != nil {
		return err
	}
	*t = LocalTime(parsedTime.Local())
	return nil
}

func (t *LocalTime) IsZero() bool {
	return time.Time(*t).IsZero()
}

// String 返回 LocalTime 的字符串表示
func (t LocalTime) String() string {
	if t.IsZero() {
		return ""
	}
	tt := time.Time(t)
	return tt.Local().Format(time.DateTime)
}

// Value 实现 driver.Valuer 接口，用于数据库操作
func (t LocalTime) Value() (driver.Value, error) {
	tt := time.Time(t)
	if tt.IsZero() {
		return nil, nil
	}
	return tt.Local(), nil
}

// Scan 实现 sql.Scanner 接口，用于数据库操作
func (t *LocalTime) Scan(value interface{}) error {
	if value == nil {
		*t = LocalTime(time.Time{})
		return nil
	}
	switch v := value.(type) {
	case time.Time:
		*t = LocalTime(v.Local())
	case []byte:
		parsedTime, err := time.Parse(time.DateTime, string(v))
		if err != nil {
			return err
		}
		*t = LocalTime(parsedTime.Local())
	case string:
		parsedTime, err := time.Parse(time.DateTime, v)
		if err != nil {
			return err
		}
		*t = LocalTime(parsedTime.Local())
	default:
		return fmt.Errorf("unsupported type: %T", value)
	}
	return nil
}
